Skip to content

Conversation

@connortsui20
Copy link
Contributor

@connortsui20 connortsui20 commented Dec 13, 2025

This change optimizes the scalar take compute function over slices.

I wanted to optimize this before I start benchmarking the hand-written SIMD code we will bring back in #5722

It is pretty crazy how the compiler was not able to figure this out on its own...

We can look at the codspeed numbers but on my machine (AMD 7950X) this is ~10% faster:

Original:

Details
take_primitive           fastest       │ slowest       │ median        │ mean          │ samples │ iters
├─ pvector_take_uniform                │               │               │               │         │
│  ├─ 16                               │               │               │               │         │
│  │  ├─ 1000            302.2 ns      │ 5.807 µs      │ 309.7 ns      │ 311.4 ns      │ 100000  │ 400000
│  │  ├─ 10000           2.489 µs      │ 29.7 µs       │ 2.529 µs      │ 2.617 µs      │ 100000  │ 100000
│  │  ╰─ 100000          24.34 µs      │ 115.5 µs      │ 24.76 µs      │ 24.89 µs      │ 100000  │ 100000
│  ├─ 256                              │               │               │               │         │
│  │  ├─ 1000            272.2 ns      │ 1.327 µs      │ 279.7 ns      │ 280.4 ns      │ 100000  │ 400000
│  │  ├─ 10000           2.489 µs      │ 8.309 µs      │ 2.519 µs      │ 2.53 µs       │ 100000  │ 100000
│  │  ╰─ 100000          24.74 µs      │ 107.3 µs      │ 24.87 µs      │ 25.06 µs      │ 100000  │ 100000
│  ├─ 2048                             │               │               │               │         │
│  │  ├─ 1000            272.2 ns      │ 3.007 µs      │ 279.7 ns      │ 281.7 ns      │ 100000  │ 400000
│  │  ├─ 10000           2.499 µs      │ 8.799 µs      │ 2.529 µs      │ 2.54 µs       │ 100000  │ 100000
│  │  ╰─ 100000          24.73 µs      │ 108.7 µs      │ 24.83 µs      │ 24.98 µs      │ 100000  │ 100000
│  ╰─ 8192                             │               │               │               │         │
│     ├─ 1000            304.7 ns      │ 1.589 µs      │ 314.7 ns      │ 316.4 ns      │ 100000  │ 400000
│     ├─ 10000           2.589 µs      │ 13.7 µs       │ 2.639 µs      │ 2.65 µs       │ 100000  │ 100000
│     ╰─ 100000          25.43 µs      │ 118.1 µs      │ 25.57 µs      │ 25.71 µs      │ 100000  │ 100000
╰─ pvector_take_zipfian                │               │               │               │         │
   ├─ 16                               │               │               │               │         │
   │  ├─ 1000            269.7 ns      │ 1.744 µs      │ 277.2 ns      │ 279.8 ns      │ 100000  │ 400000
   │  ├─ 10000           2.469 µs      │ 9.289 µs      │ 2.519 µs      │ 2.531 µs      │ 100000  │ 100000
   │  ╰─ 100000          24.5 µs       │ 106.4 µs      │ 24.77 µs      │ 24.91 µs      │ 100000  │ 100000
   ├─ 256                              │               │               │               │         │
   │  ├─ 1000            272.2 ns      │ 1.452 µs      │ 277.2 ns      │ 279.8 ns      │ 100000  │ 400000
   │  ├─ 10000           2.489 µs      │ 7.209 µs      │ 2.519 µs      │ 2.53 µs       │ 100000  │ 100000
   │  ╰─ 100000          24.41 µs      │ 106.1 µs      │ 24.86 µs      │ 25.01 µs      │ 100000  │ 100000
   ├─ 2048                             │               │               │               │         │
   │  ├─ 1000            267.2 ns      │ 1.422 µs      │ 277.2 ns      │ 279.1 ns      │ 100000  │ 400000
   │  ├─ 10000           2.459 µs      │ 7.339 µs      │ 2.519 µs      │ 2.528 µs      │ 100000  │ 100000
   │  ╰─ 100000          24.31 µs      │ 113.7 µs      │ 24.79 µs      │ 24.9 µs       │ 100000  │ 100000
   ╰─ 8192                             │               │               │               │         │
      ├─ 1000            279.7 ns      │ 1.289 µs      │ 292.2 ns      │ 292.3 ns      │ 100000  │ 400000
      ├─ 10000           2.489 µs      │ 10.74 µs      │ 2.55 µs       │ 2.562 µs      │ 100000  │ 100000
      ╰─ 100000          24.72 µs      │ 109.8 µs      │ 25.22 µs      │ 25.37 µs      │ 100000  │ 100000

New:

Details
take_primitive           fastest       │ slowest       │ median        │ mean          │ samples │ iters
├─ pvector_take_uniform                │               │               │               │         │
│  ├─ 16                               │               │               │               │         │
│  │  ├─ 1000            259.8 ns      │ 4.559 µs      │ 264.8 ns      │ 266.9 ns      │ 100000  │ 400000
│  │  ├─ 10000           2.349 µs      │ 29.49 µs      │ 2.389 µs      │ 2.403 µs      │ 100000  │ 100000
│  │  ╰─ 100000          23.19 µs      │ 165.3 µs      │ 23.68 µs      │ 23.83 µs      │ 100000  │ 100000
│  ├─ 256                              │               │               │               │         │
│  │  ├─ 1000            259.8 ns      │ 7.234 µs      │ 264.8 ns      │ 265.4 ns      │ 100000  │ 400000
│  │  ├─ 10000           2.319 µs      │ 24.78 µs      │ 2.369 µs      │ 2.383 µs      │ 100000  │ 100000
│  │  ╰─ 100000          23.09 µs      │ 103.7 µs      │ 23.44 µs      │ 23.58 µs      │ 100000  │ 100000
│  ├─ 2048                             │               │               │               │         │
│  │  ├─ 1000            262.3 ns      │ 6.077 µs      │ 267.3 ns      │ 269.4 ns      │ 100000  │ 400000
│  │  ├─ 10000           2.369 µs      │ 29.22 µs      │ 2.429 µs      │ 2.434 µs      │ 100000  │ 100000
│  │  ╰─ 100000          23.45 µs      │ 114.8 µs      │ 23.65 µs      │ 23.88 µs      │ 100000  │ 100000
│  ╰─ 8192                             │               │               │               │         │
│     ├─ 1000            289.8 ns      │ 3.692 µs      │ 302.3 ns      │ 303.3 ns      │ 100000  │ 400000
│     ├─ 10000           2.529 µs      │ 33.29 µs      │ 2.579 µs      │ 2.599 µs      │ 100000  │ 100000
│     ╰─ 100000          25.24 µs      │ 113.6 µs      │ 25.51 µs      │ 25.68 µs      │ 100000  │ 100000
╰─ pvector_take_zipfian                │               │               │               │         │
   ├─ 16                               │               │               │               │         │
   │  ├─ 1000            259.8 ns      │ 2.439 µs      │ 264.8 ns      │ 265.6 ns      │ 100000  │ 400000
   │  ├─ 10000           2.349 µs      │ 16.86 µs      │ 2.379 µs      │ 2.388 µs      │ 100000  │ 100000
   │  ╰─ 100000          23.44 µs      │ 106.8 µs      │ 23.63 µs      │ 23.77 µs      │ 100000  │ 100000
   ├─ 256                              │               │               │               │         │
   │  ├─ 1000            259.8 ns      │ 1.409 µs      │ 264.8 ns      │ 266.5 ns      │ 100000  │ 400000
   │  ├─ 10000           2.339 µs      │ 48.63 µs      │ 2.379 µs      │ 2.384 µs      │ 100000  │ 100000
   │  ╰─ 100000          23.41 µs      │ 111.6 µs      │ 23.6 µs       │ 23.75 µs      │ 100000  │ 100000
   ├─ 2048                             │               │               │               │         │
   │  ├─ 1000            262.3 ns      │ 1.432 µs      │ 267.3 ns      │ 268.8 ns      │ 100000  │ 400000
   │  ├─ 10000           2.409 µs      │ 10.32 µs      │ 2.449 µs      │ 2.459 µs      │ 100000  │ 100000
   │  ╰─ 100000          23.58 µs      │ 109.2 µs      │ 23.87 µs      │ 24.05 µs      │ 100000  │ 100000
   ╰─ 8192                             │               │               │               │         │
      ├─ 1000            264.8 ns      │ 1.484 µs      │ 272.3 ns      │ 272.9 ns      │ 100000  │ 400000
      ├─ 10000           2.429 µs      │ 10.99 µs      │ 2.469 µs      │ 2.483 µs      │ 100000  │ 100000
      ╰─ 100000          24.21 µs      │ 110.2 µs      │ 24.46 µs      │ 24.62 µs      │ 100000  │ 100000

Edit: Accidentally used the wrong numbers, seems to be about 10% faster in general

@connortsui20 connortsui20 requested a review from gatesn December 13, 2025 16:49
@connortsui20 connortsui20 added the performance Release label indicating an improvement to performance label Dec 13, 2025
@connortsui20 connortsui20 enabled auto-merge (squash) December 13, 2025 16:49
@codspeed-hq
Copy link

codspeed-hq bot commented Dec 13, 2025

CodSpeed Performance Report

Merging #5723 will improve performances by 19.22%

Comparing ct/optimize-scalar-take (5783a6b) with develop (5c5f7d1)

Summary

⚡ 29 improvements
✅ 1227 untouched
⏩ 621 skipped1

Benchmarks breakdown

Benchmark BASE HEAD Change
decode_primitives[u8, (10000, 32)] 73.4 µs 63.5 µs +15.56%
decode_primitives[u8, (10000, 2)] 73.3 µs 63.5 µs +15.58%
decode_primitives[u8, (10000, 128)] 73.4 µs 63.6 µs +15.55%
decode_primitives[u8, (10000, 512)] 73.4 µs 63.5 µs +15.63%
decode_primitives[u8, (10000, 4)] 73.5 µs 63.6 µs +15.54%
decode_primitives[u8, (10000, 8)] 73.5 µs 63.6 µs +15.55%
pvector_take_uniform[16, 10000] 80 µs 70.5 µs +13.55%
pvector_take_uniform[2048, 10000] 84.6 µs 74.8 µs +13.1%
pvector_take_uniform[16, 100000] 758.8 µs 674.3 µs +12.53%
pvector_take_uniform[2048, 1000] 16.3 µs 14.3 µs +14.34%
pvector_take_uniform[2048, 100000] 763.2 µs 678 µs +12.56%
pvector_take_uniform[8192, 10000] 97.4 µs 87.8 µs +10.87%
pvector_take_uniform[16, 1000] 13.1 µs 11.1 µs +18.25%
pvector_take_zipfian[16, 100000] 758.8 µs 674.3 µs +12.53%
pvector_take_zipfian[256, 10000] 80.7 µs 71.2 µs +13.33%
pvector_take_uniform[256, 100000] 759.3 µs 674.8 µs +12.53%
pvector_take_uniform[256, 10000] 80.8 µs 71.2 µs +13.36%
pvector_take_zipfian[16, 1000] 12.3 µs 10.3 µs +19.22%
pvector_take_zipfian[8192, 100000] 785.2 µs 700.6 µs +12.08%
pvector_take_zipfian[16, 10000] 80.3 µs 70.8 µs +13.42%
... ... ... ... ...

ℹ️ Only the first 20 benchmarks are displayed. Go to the app to view all benchmarks.

Footnotes

  1. 621 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@codecov
Copy link

codecov bot commented Dec 13, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 82.93%. Comparing base (5c5f7d1) to head (5783a6b).
⚠️ Report is 6 commits behind head on develop.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Signed-off-by: Connor Tsui <connor.tsui20@gmail.com>
@connortsui20 connortsui20 force-pushed the ct/optimize-scalar-take branch from ecd0496 to 5783a6b Compare December 13, 2025 17:03
@connortsui20 connortsui20 requested a review from gatesn December 13, 2025 17:04
@connortsui20 connortsui20 merged commit b7fb836 into develop Dec 15, 2025
47 checks passed
@connortsui20 connortsui20 deleted the ct/optimize-scalar-take branch December 15, 2025 13:27
paultiq pushed a commit to paultiq/vortex that referenced this pull request Dec 17, 2025
This change optimizes the scalar `take` compute function over slices.

It is pretty crazy how the compiler was not able to figure this out on
its own...

We can look at the codspeed numbers but on my machine this is ~35%
faster:

Original:

<details>

```
├─ pvector_take_uniform                     │               │               │               │         │
│  ├─ 16                                    │               │               │               │         │
│  │  ├─ 1000                 404.8 ns      │ 6.394 µs      │ 409.8 ns      │ 413.1 ns      │ 100000  │ 400000
│  │  ├─ 10000                3.689 µs      │ 34.39 µs      │ 3.709 µs      │ 3.746 µs      │ 100000  │ 100000
│  │  ╰─ 100000               36.43 µs      │ 124 µs        │ 36.63 µs      │ 37 µs         │ 100000  │ 100000
│  ├─ 256                                   │               │               │               │         │
│  │  ├─ 1000                 404.8 ns      │ 20.97 µs      │ 409.8 ns      │ 419.7 ns      │ 100000  │ 400000
│  │  ├─ 10000                3.679 µs      │ 81.82 µs      │ 3.699 µs      │ 3.78 µs       │ 100000  │ 100000
│  │  ╰─ 100000               36.45 µs      │ 122.8 µs      │ 36.54 µs      │ 36.95 µs      │ 100000  │ 100000
│  ├─ 2048                                  │               │               │               │         │
│  │  ├─ 1000                 409.8 ns      │ 30.72 µs      │ 429.8 ns      │ 433.4 ns      │ 100000  │ 100000
│  │  ├─ 10000                3.689 µs      │ 21.1 µs       │ 3.699 µs      │ 3.718 µs      │ 100000  │ 100000
│  │  ╰─ 100000               36.51 µs      │ 124.3 µs      │ 36.79 µs      │ 37.2 µs       │ 100000  │ 100000
│  ╰─ 8192                                  │               │               │               │         │
│     ├─ 1000                 419.8 ns      │ 5.489 µs      │ 434.8 ns      │ 437.4 ns      │ 100000  │ 200000
│     ├─ 10000                3.699 µs      │ 38.87 µs      │ 3.749 µs      │ 3.793 µs      │ 100000  │ 100000
│     ╰─ 100000               36.55 µs      │ 122.1 µs      │ 36.95 µs      │ 37.19 µs      │ 100000  │ 100000
╰─ pvector_take_zipfian                     │               │               │               │         │
   ├─ 16                                    │               │               │               │         │
   │  ├─ 1000                 404.8 ns      │ 2.012 µs      │ 407.3 ns      │ 409.6 ns      │ 100000  │ 400000
   │  ├─ 10000                3.689 µs      │ 30.16 µs      │ 3.719 µs      │ 3.729 µs      │ 100000  │ 100000
   │  ╰─ 100000               36.53 µs      │ 125.6 µs      │ 36.78 µs      │ 37.06 µs      │ 100000  │ 100000
   ├─ 256                                   │               │               │               │         │
   │  ├─ 1000                 409.8 ns      │ 4.949 µs      │ 414.8 ns      │ 415.4 ns      │ 100000  │ 200000
   │  ├─ 10000                3.689 µs      │ 29.16 µs      │ 3.719 µs      │ 3.731 µs      │ 100000  │ 100000
   │  ╰─ 100000               36.52 µs      │ 122.6 µs      │ 36.77 µs      │ 37 µs         │ 100000  │ 100000
   ├─ 2048                                  │               │               │               │         │
   │  ├─ 1000                 399.8 ns      │ 6.302 µs      │ 404.8 ns      │ 428.2 ns      │ 100000  │ 400000
   │  ├─ 10000                3.689 µs      │ 25.36 µs      │ 3.699 µs      │ 3.736 µs      │ 100000  │ 100000
   │  ╰─ 100000               36.5 µs       │ 121.6 µs      │ 36.72 µs      │ 36.96 µs      │ 100000  │ 100000
   ╰─ 8192                                  │               │               │               │         │
      ├─ 1000                 407.3 ns      │ 1.914 µs      │ 412.3 ns      │ 415.2 ns      │ 100000  │ 400000
      ├─ 10000                3.689 µs      │ 13.83 µs      │ 3.729 µs      │ 3.744 µs      │ 100000  │ 100000
      ╰─ 100000               36.47 µs      │ 126.8 µs      │ 37.41 µs      │ 37.79 µs      │ 100000  │ 100000
```

</details>

New:

<details>

```
take_primitive           fastest       │ slowest       │ median        │ mean          │ samples │ iters
├─ pvector_take_uniform                │               │               │               │         │
│  ├─ 16                               │               │               │               │         │
│  │  ├─ 1000            279.8 ns      │ 15.9 µs       │ 299.8 ns      │ 300.4 ns      │ 100000  │ 100000
│  │  ├─ 10000           2.529 µs      │ 22.95 µs      │ 2.569 µs      │ 2.592 µs      │ 100000  │ 100000
│  │  ╰─ 100000          23.32 µs      │ 115.6 µs      │ 23.66 µs      │ 23.95 µs      │ 100000  │ 100000
│  ├─ 256                              │               │               │               │         │
│  │  ├─ 1000            257.3 ns      │ 1.302 µs      │ 264.8 ns      │ 267.2 ns      │ 100000  │ 400000
│  │  ├─ 10000           2.519 µs      │ 42.61 µs      │ 2.569 µs      │ 2.606 µs      │ 100000  │ 100000
│  │  ╰─ 100000          23.59 µs      │ 117.2 µs      │ 23.71 µs      │ 24.03 µs      │ 100000  │ 100000
│  ├─ 2048                             │               │               │               │         │
│  │  ├─ 1000            262.3 ns      │ 3.857 µs      │ 267.3 ns      │ 270.4 ns      │ 100000  │ 400000
│  │  ├─ 10000           2.559 µs      │ 19.81 µs      │ 2.599 µs      │ 2.631 µs      │ 100000  │ 100000
│  │  ╰─ 100000          23.48 µs      │ 111 µs        │ 23.62 µs      │ 23.99 µs      │ 100000  │ 100000
│  ╰─ 8192                             │               │               │               │         │
│     ├─ 1000            292.3 ns      │ 6.382 µs      │ 302.3 ns      │ 304.2 ns      │ 100000  │ 400000
│     ├─ 10000           2.749 µs      │ 21.31 µs      │ 2.799 µs      │ 2.819 µs      │ 100000  │ 100000
│     ╰─ 100000          25.28 µs      │ 118.3 µs      │ 25.56 µs      │ 25.9 µs       │ 100000  │ 100000
╰─ pvector_take_zipfian                │               │               │               │         │
   ├─ 16                               │               │               │               │         │
   │  ├─ 1000            257.3 ns      │ 5.714 µs      │ 264.8 ns      │ 267.7 ns      │ 100000  │ 400000
   │  ├─ 10000           2.519 µs      │ 20.1 µs       │ 2.569 µs      │ 2.593 µs      │ 100000  │ 100000
   │  ╰─ 100000          23.43 µs      │ 105.6 µs      │ 23.6 µs       │ 23.87 µs      │ 100000  │ 100000
   ├─ 256                              │               │               │               │         │
   │  ├─ 1000            259.8 ns      │ 1.259 µs      │ 264.8 ns      │ 267.7 ns      │ 100000  │ 400000
   │  ├─ 10000           2.509 µs      │ 36.64 µs      │ 2.569 µs      │ 2.763 µs      │ 100000  │ 100000
   │  ╰─ 100000          23.2 µs       │ 107 µs        │ 23.59 µs      │ 23.87 µs      │ 100000  │ 100000
   ├─ 2048                             │               │               │               │         │
   │  ├─ 1000            259.8 ns      │ 1.957 µs      │ 267.3 ns      │ 275.8 ns      │ 100000  │ 400000
   │  ├─ 10000           2.569 µs      │ 9.469 µs      │ 2.609 µs      │ 2.644 µs      │ 100000  │ 100000
   │  ╰─ 100000          23.72 µs      │ 109.6 µs      │ 23.99 µs      │ 24.27 µs      │ 100000  │ 100000
   ╰─ 8192                             │               │               │               │         │
      ├─ 1000            269.8 ns      │ 26.15 µs      │ 284.8 ns      │ 289.4 ns      │ 100000  │ 200000
      ├─ 10000           2.709 µs      │ 8.879 µs      │ 2.739 µs      │ 2.751 µs      │ 100000  │ 100000
      ╰─ 100000          24.27 µs      │ 107.2 µs      │ 24.53 µs      │ 24.74 µs      │ 100000  │ 100000
```

</details>

Signed-off-by: Connor Tsui <connor.tsui20@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

performance Release label indicating an improvement to performance

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants